/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.client.ordenproduccion;

import co.com.ces4.client.baseView.QueryBase;
import co.com.ces4.produccion.client.OrdenProduccionService;
import co.com.ces4.produccion.client.OrdenProduccionServiceAsync;
import co.com.ces4.produccion.client.SolicitudProduccionService;
import co.com.ces4.produccion.client.SolicitudProduccionServiceAsync;
import co.com.ces4.produccion.client.ordenproduccion.data.OrdenProduccionDS;
import co.com.ces4.produccion.client.ordenproduccion.data.OrdenProduccionRecord;
import co.com.ces4.produccion.client.solicitudproduccion.data.SolicitudProduccionDS;
import co.com.ces4.produccion.client.solicitudproduccion.data.SolicitudProduccionRecord;
import co.com.ces4.produccion.client.utils.Loader;
import co.com.ces4.produccion.jpa.entities.OrdenProduccion;
import co.com.ces4.produccion.jpa.entities.SolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.Usuario;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.smartgwt.client.data.SortSpecifier;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.DateDisplayFormat;
import com.smartgwt.client.types.SortDirection;
import com.smartgwt.client.util.BooleanCallback;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Button;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.ButtonItem;
import com.smartgwt.client.widgets.form.fields.DateItem;
import com.smartgwt.client.widgets.form.fields.SelectItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.Layout;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Sebastian
 */
public class ConsultarOrdenProduccion extends QueryBase {

    private DynamicForm frmFiltrosBusqueda;
    private HLayout hlyAccionesConsulta;
    private DateItem dtpFechaInicio, dtpFechaFin;
    private SelectItem cbxSolicitudProduccion;
    private ButtonItem btnConsultar, btnLimpiar;
    private Button btnNuevo;
    private ListGrid resultsGrid;
    private SolicitudProduccionDS solicitudProduccionDS;

    public ConsultarOrdenProduccion() {
        super("Consulta de Ordenes de Producción", "Parámetros de búsqueda", "Resultados", "100%");
        frmFiltrosBusqueda = new DynamicForm();
        frmFiltrosBusqueda.setCellPadding(10);
        frmFiltrosBusqueda.setWidth100();
        frmFiltrosBusqueda.setHeight("15px");
        frmFiltrosBusqueda.setNumCols(4);

        dtpFechaInicio = new DateItem("dtpFechaInicio", "Fecha de Inicio");
        dtpFechaInicio.setUseTextField(true);
        dtpFechaInicio.setRequired(true);
        dtpFechaInicio.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);
        dtpFechaFin = new DateItem("dtpFechaFin", "Fecha de Fin");
        dtpFechaFin.setUseTextField(true);
        dtpFechaFin.setRequired(true);
        dtpFechaFin.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE);

        solicitudProduccionDS = new SolicitudProduccionDS();

        cbxSolicitudProduccion = new SelectItem("cbxOutsourcing", "Outsourcing");
        cbxSolicitudProduccion.setEmptyPickListMessage("No hay registros para mostrar");
        cbxSolicitudProduccion.setEmptyDisplayValue("--- Seleccione ---");
        cbxSolicitudProduccion.setValueField(SolicitudProduccionDS.IDSOLICITUD);
        cbxSolicitudProduccion.setDisplayField(SolicitudProduccionDS.IDSOLICITUD + ". " + SolicitudProduccionDS.LOGINUSUARIO);
        cbxSolicitudProduccion.setRequired(true);

        btnConsultar = new ButtonItem("btnConsultar", "Consultar");
        btnConsultar.setColSpan(2);
        btnConsultar.setStartRow(true);
        btnConsultar.setEndRow(false);
        btnConsultar.setAlign(Alignment.RIGHT);
        btnConsultar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                ordenesList();
            }
        });

        btnLimpiar = new ButtonItem("btnLimpiar", "Limpiar");
        btnLimpiar.setColSpan(2);
        btnLimpiar.setStartRow(false);
        btnLimpiar.setEndRow(true);
        btnLimpiar.setAlign(Alignment.LEFT);
        btnLimpiar.setTop(10);
        btnLimpiar.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                frmFiltrosBusqueda.clearValues();
                clearResults();
            }
        });

        btnNuevo = new Button("Nueva");
        btnNuevo.addClickHandler(new com.smartgwt.client.widgets.events.ClickHandler() {

            @Override
            public void onClick(com.smartgwt.client.widgets.events.ClickEvent event) {
                getOrdenProduccionService().getUserSession(new AsyncCallback<Usuario>() {

                    public void onFailure(Throwable caught) {
                        SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                            @Override
                            public void execute(Boolean value) {
                            }
                        }, new Dialog());
                    }

                    public void onSuccess(Usuario usuario) {
                        if (usuario != null) {
                            final EdicionOrdenProduccion eop = new EdicionOrdenProduccion(usuario);
                            ConsultarOrdenProduccion.this.hide();
                            eop.setLayoutData("Nueva Solicitud de Producción");
                            ((Layout) ConsultarOrdenProduccion.this.getParentElement()).addMember(eop);
                        } else {
                            SC.warn("Error", "Señor usuario, ocurrió un error inesperado en el sistema, por favor intente más tarde", new BooleanCallback() {

                                @Override
                                public void execute(Boolean value) {
                                }
                            }, new Dialog());
                            return;
                        }
                    }
                });
            }
        });
        frmFiltrosBusqueda.setMargin(15);
        frmFiltrosBusqueda.setItems(dtpFechaInicio, dtpFechaFin, btnConsultar, btnLimpiar);

        hlyAccionesConsulta = new HLayout();
        hlyAccionesConsulta.setWidth100();
        hlyAccionesConsulta.setAlign(Alignment.LEFT);
        hlyAccionesConsulta.setMargin(5);
        hlyAccionesConsulta.addMember(btnNuevo);
        hlyAccionesConsulta.setMembersMargin(15);

        resultsGrid = new ListGrid();
        resultsGrid.setWidth100();
        resultsGrid.setHeight100();
        resultsGrid.setDataSource(new OrdenProduccionDS());
        resultsGrid.setAutoFetchData(true);
        resultsGrid.setFields(OrdenProduccionRecord.getFields());
        resultsGrid.setEmptyMessage("No hay registros para mostrar");
        resultsGrid.setFilterOnKeypress(true);
        resultsGrid.setShowFilterEditor(true);
        resultsGrid.getField(OrdenProduccionDS.FECHAORDEN).setWidth(140);
        SortSpecifier[] specifiers = new SortSpecifier[]{new SortSpecifier(OrdenProduccionDS.FECHAORDEN, SortDirection.DESCENDING)};
        resultsGrid.setSort(specifiers);

        cargarSolicitudes();
        addSectionContainerItem(hlyAccionesConsulta);
        setFilterSectionItems(frmFiltrosBusqueda);
        addResultsSectionItem(resultsGrid);
    }

    private void cargarSolicitudes() {
        getSolicitudProduccionService().getSolicitudesProduccion(new AsyncCallback<List<SolicitudProduccion>>() {

            @Override
            public void onFailure(Throwable caught) {
                SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                    @Override
                    public void execute(Boolean value) {
                    }
                }, new Dialog());
                Loader.hideLoader();
            }

            @Override
            public void onSuccess(List<SolicitudProduccion> result) {
                for (int i = 0; i < result.size(); i++) {
                    solicitudProduccionDS.addData(new SolicitudProduccionRecord(result.get(i)));
                }
                cbxSolicitudProduccion.setOptionDataSource(solicitudProduccionDS);
            }
        });
    }

    private void ordenesList() {
        if (frmFiltrosBusqueda.validate()) {
            Date fechaInicio = dtpFechaInicio.getValueAsDate();
            Date fechaFin = dtpFechaFin.getValueAsDate();
            SolicitudProduccion solicitudProduccion = cbxSolicitudProduccion.getSelectedRecord() == null ? null : (SolicitudProduccion) cbxSolicitudProduccion.getSelectedRecord().getAttributeAsObject("solicitudProduccion");
            if (dtpFechaInicio.getValueAsDate().before(dtpFechaFin.getValueAsDate()) || dtpFechaInicio.getValueAsDate().getDate() == dtpFechaFin.getValueAsDate().getDate()) {
                Loader.showLoader();
                final AsyncCallback<List<OrdenProduccion>> queryCallback = new AsyncCallback<List<OrdenProduccion>>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        SC.warn("Error", caught.getMessage(), new BooleanCallback() {

                            @Override
                            public void execute(Boolean value) {
                            }
                        }, new Dialog());
                        Loader.hideLoader();
                    }

                    @Override
                    public void onSuccess(List<OrdenProduccion> result) {
                        clearResults();
                        for (int i = 0; i < result.size(); i++) {
                            resultsGrid.addData(new OrdenProduccionRecord(result.get(i)));
                        }
                        Loader.hideLoader();
                    }
                };
                getOrdenProduccionService().getOrdenProduccionList(fechaInicio, fechaFin, solicitudProduccion, queryCallback);
            } else {
                SC.warn("Advertencia", "La fecha de inicio no puede ser mayor que la fecha de fin", new BooleanCallback() {

                    @Override
                    public void execute(Boolean value) {
                    }
                }, new Dialog());

                return;
            }
        }
    }

    private void clearResults() {
        ListGridRecord[] records = resultsGrid.getRecords();
        if (records.length > 0) {
            for (int i = 0; i < records.length; i++) {
                resultsGrid.removeData(records[i]);
            }
        }
    }

    private OrdenProduccionServiceAsync getOrdenProduccionService() {
        return GWT.create(OrdenProduccionService.class);
    }

    private SolicitudProduccionServiceAsync getSolicitudProduccionService() {
        return GWT.create(SolicitudProduccionService.class);
    }
}
